//package com.wootion.dizhi;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.TypeReference;
//import com.wootion.dizhi.comon.MathParser;
//import com.wootion.dizhi.entity.Config;
//import com.wootion.dizhi.runData.GlobalData;
//import org.eclipse.paho.client.mqttv3.*;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.io.File;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//
///**
// * YaoYiChao
// */
//@Service
//public class MqttService {
//
//    private String resources = "./data/";
//    private String runPath = "./run/";
//
//    @Value("${my.deviceNo}")
//    private String deviceNo;
//
//    /**
//     * 数学运算类
//     */
//    @Resource
//    MathParser mathParser;
//
//    private static final String MQTT_BROKER_URI = "tcp://118.31.248.137:1883";
////    private static final String MQTT_BROKER_URI = "tcp://localhost:1883";
//    private static final String MQTT_CLIENT_ID = UUID.randomUUID().toString();
//
//    private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//
//    private MqttClient mqttClient;
//
//    public MqttService() {
//        try {
//            mqttClient = new MqttClient(MQTT_BROKER_URI, MQTT_CLIENT_ID);
//            mqttClient.setCallback(new MqttCallback() {
//                @Override
//                public void connectionLost(Throwable cause) {
//                    System.out.println("链接丢失,开始自动重连");
//                    // 在这里处理连接丢失的情况
//                    while (!mqttClient.isConnected()){
//
//                        try {
//                            mqttClient.connect();
//                            System.out.println("重连成功");
//                        } catch (MqttException e) {
//                            System.out.println("重连异常,十秒之后重");
//                            throw new RuntimeException(e);
//                        }
//                    }
//                }
//
//                @Override
//                public void messageArrived(String topic, MqttMessage message) {
//                    try {
//                        //这些是接收逻辑中用到的静态变量,查错时可以查看
//                        Map<String, JSONObject> isRun = GlobalData.RUN_DEVICE_DATA;
//                        Map<String, Config> runConfig = GlobalData.RUN_CONFIG;
////                        Map<String, List<JSONObject>> runData = GlobalData.RUN_DATA;
//                        // 在这里处理接收到的消息
//                        System.out.println("收到的消息为: " + new String(message.getPayload()));
//                        String str = new String(message.getPayload());
//                        JSONObject jsonObject = JSONObject.parseObject(str);
//                        String string = jsonObject.getString("deviceNo");
//                        //先判断报文是否和配置文件中的设备号相同,如果相同才会解析
//                        if (string.equals(deviceNo)) {
//                            String address = jsonObject.getString("address");
////                            Integer value = jsonObject.getInteger("value");
//                            Integer value = new Random().nextInt(200);
//                            System.out.println(value);
//                            //获取设备名称列表
//                            String content = new String(Files.readAllBytes(Paths.get(resources+"deviceName.MN")));
//                            Map<String, String> map2 = JSON.parseObject(content, new TypeReference<Map<String, String>>() {});
//                            //如果出现记录中没有的地址就记录默认名字
//                            if (!map2.containsKey(deviceNo+address+"name")){
//                                map2.put(deviceNo+address+"name",deviceNo+address);
//                                // 将Map转换为字符串
//                                String jsonString = JSON.toJSONString(map2);
//                                FileWriter writer = new FileWriter(new File(resources + "deviceName.MN"), false);
//                                writer.write(jsonString);
//                                writer.close();
//                            }
//
//
//                            LocalDateTime now = LocalDateTime.now();
//                            JSONObject jsonObject1 = GlobalData.RUN_DEVICE_DATA.get(address);
//                            //判断当前设备是否在线
//                            if (Optional.ofNullable(jsonObject1).isPresent()) {
//                                //从run_device_data中获取运行设备状态
//                                Integer status = jsonObject1.getInteger("status");
//                                //判断当前设备是否为记录状态,status为0则为记录状态
//                                if (Optional.ofNullable(jsonObject1).isPresent() && status == 0) {
//                                    Config config = runConfig.get(deviceNo + address);
//                                    String parser = "";
//                                    //判断网关是否有上报值,网关如果没有没有读到值则会导致报文中没有value值
//                                    //以下if本来是处理如果收到null值则变更为异常中断状态,在客户展览时临时改为当收到null值时则改为上一次的值,并非需求
//                                    if (!Optional.ofNullable(value).isPresent()) {
//                                        System.out.println("接收到null值,已处理,地址: "+address+"时间为"+now.format(dateTimeFormatter));
//                                        List<JSONObject> list = getList(deviceNo, address, config.getExperiment());
//                                        JSONObject jsonObject2 = list.get(list.size()-1);
//                                        parser = jsonObject2.getString("value");
////                                        jsonObject1.put("status", 2);
////                                        GlobalData.RUN_DEVICE_DATA.put(string + address, jsonObject1);
//                                    }
//                                    //读取设备运行文件
//                                    File file = new File(runPath + deviceNo + address + config.getExperiment() + ".MA");
//                                    boolean isFileEmpty = file.length() == 0;
//                                    FileWriter writer2 = new FileWriter(file, true);
//                                    JSONObject jsonObject2 = new JSONObject();
//                                    //根据客户给的公式进行计算
//                                    if (Optional.ofNullable(value).isPresent()){
//                                        parser = mathParser.parser(value);
//                                    }
//                                    jsonObject2.put("value", parser);
//                                    jsonObject2.put("time", now.format(dateTimeFormatter));
//                                    //写入文件
//                                    if (isFileEmpty) {
//                                        //文件为空
//                                        writer2.write(jsonObject2.toJSONString());
//                                    } else {
//                                        //文件非空
//                                        writer2.write("OIOAF" + jsonObject2.toJSONString());
//                                    }
//                                    writer2.close();
//                                }
//
//                            }
////                            GlobalData.DEVICE_STATUS.put(deviceNo + address, new Date());//更新最后一次上报状态
//                        }
//                        }catch (Exception e){
//                        e.printStackTrace();
//                    }
//
//                }
//
//                @Override
//                public void deliveryComplete(IMqttDeliveryToken token) {
//                    try {
//                        System.out.println("主题:"+token.getTopics()[0]+"消息:"+token.getMessage()+"发送确认成功");
//                    } catch (MqttException e) {
//                        throw new RuntimeException(e);
//                    }
//                    // 在这里处理消息交付完成的情况
//                }
//            });
//
//            //设置自动重连
//            MqttConnectOptions options = new MqttConnectOptions();
//            options.setAutomaticReconnect(true);
//            options.setCleanSession(true);
//
//            mqttClient.connect(options);
//            // 订阅一个主题
//            mqttClient.subscribe("/test");
//        } catch (MqttException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public void publish(String topic, MqttMessage message) {
//        System.out.println("开始发送消息");
//        try {
//            mqttClient.publish(topic, message);
//        } catch (MqttException e) {
//            e.printStackTrace();
//        }
//        System.out.println("消息发送成功,等待确认");
//    }
//
//    /**
//     * 从运行文件中获取记录并转为list
//     * @param deviceNo
//     * @param address
//     * @param experiment
//     * @return
//     * @throws IOException
//     */
//    private List<JSONObject> getList(String deviceNo,String address,String experiment) throws IOException {
//        List<JSONObject> list = new ArrayList<>();
//        String content2 = new String(Files.readAllBytes(Paths.get(runPath+deviceNo+address+experiment+".MA")));
//        String[] split = content2.split("OIOAF");
//        if (split.length>0){
//            for (String s : split) {
//                if (!"".equals(s)){
//                    JSONObject jsonObject1 = JSONObject.parseObject(s);
//                    list.add(jsonObject1);
//                }
//            }
//            return list;
//        }else {
//            return list;
//        }
//    }
//
//}
